import re
import tkinter
import tkinter.messagebox

root = tkinter.Tk()

root.geometry('300x270+400+100')

root.resizable(False, False)

root.title('简易计算器-董付国')


contentVar = tkinter.StringVar(root,'')
contentEntry = tkinter.Entry(root, textvariable=contentVar)
contentEntry['state'] = 'readonly'
contentEntry.place(x=10, y=10, width=280, height=20)


def buttonClick(btn):
  content = contentVar.get()

  if content.startswith('.'):
      content = '0' + content
  
  if btn in '0123456789':
     content += btn
  elif btn == '.':
     lastPart = re.split(r'\+|-|\*|/]',content)[-1] 
     if '.' in lastPart:
         tkinter.messagebox.showerror('错误','小数点太多了')
         return
     else:
        content += btn
  elif btn == 'C':
     content = ''
  elif btn =='=':
     try:
        content = str(eval(content))
     except:
        tkinter.messagebox.showerror('错误','表达式错误')
        return
  elif btn in operators:
     if content.endswith(operators):
         tkinter.messagebox.showerror('错误',
                            '不允许存在连续运算符')
         return
     content += btn
  elif btn =='Sqrt':
     n = content.split('.')
     if  all(map(lambda x: x.isdigit(), n)):
          content =  eval(content) ** 0.5
     else:
        tkinter.messagebox.showerror('错误','表达式错误')
        return
  contentVar.set(content)
btnClear = tkinter.Button(root,
                  text='Clear',
                  command=lambda: buttonClick('C'))
btnClear.place(x=40,y=40,width=80,height=20)  
btnCompute = tkinter.Button(root,
                  text='=',
                  command=lambda: buttonClick('='))
btnCompute.place(x=170,y=40,width=80,height=20)

digits = list('0123456789.') + ['Sqrt']
index = 0
for row in range(4):
   for col in range(3):
      d = digits[index]
      index += 1
      btnDigit = tkinter.Button(root,text=d,command=lambda x=d:buttonClick(x))
      btnDigit.place(x=20+col*70,
              y=80+row*50,
                width=50,
                height=20)
operators = ('+','-','*','/','**','//')
for index,operator in enumerate(operators):
   btnOperator = tkinter.Button(root,
                      text=operator,
                 command=lambda x=operator:buttonClick(x))
   btnOperator.place(x=230, y=80+index*30, width=50, height=20)

root.mainloop()             